package com.qkjia.easyexcel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.qkjia.easyexcel.dto.ExcelStudentDTO;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *  @author 赵乾坤
 *  @since 2021-11-05 5:14
 */
public class ExcelWriteTest {
    @Test
    public void simpleWriteXlsx() {


        // 写法1 JDK8+
        // since: 3.0.0-beta1
        String fileName = "d:/excel/simpleWrite.xlsx"; //需要提前新建目录
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
     EasyExcel.write(fileName, ExcelStudentDTO.class).sheet("模板").doWrite(data());


    }

    /**
     * 写入不同版本execl
     * // 写法2
     */
    @Test
    public void simpleWriteXls() {
        String fileName = "d:/excel/simpleWrite.xls";
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, ExcelStudentDTO.class).excelType(ExcelTypeEnum.XLS).sheet("模板").doWrite(data());
    }

    /**
     * 写法三 大数据量 data由10改为60000
     * 最大量是65536 + 标题  最大范围是65535
     * xls 版本的Excel最多一次可写0 ...65535行
     * xlsx 版本的Excel最多一次可写0...1048575行
     */
    @Test
    public void bigData() {
        // 写法3
        String fileName = "d:/excel/simpleWrite.xlsx";

        // 这里 需要指定写用哪个class去写
        ExcelWriter excelWriter = null;
        try {
            excelWriter = EasyExcel.write(fileName, ExcelStudentDTO.class).build();
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
            excelWriter.write(data(), writeSheet);
        } finally {
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
    }

    //辅助方法
    private List<ExcelStudentDTO> data(){
        List<ExcelStudentDTO> list = new ArrayList<>();
        //算上标题，做多可写65536行
        //超出：java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
        for (int i = 0; i < 10; i++) {
            ExcelStudentDTO data = new ExcelStudentDTO();
            data.setName("Helen" + i);
            data.setBirthday(new Date());
            data.setSalary(123456.1234);
            list.add(data);
        }
        return list;
    }


}
